;; 内建的 emacs 数据类型称为 primitive types，
;; 包括整数、浮点数、cons、符号（symbol）、字符串、向量（vector）、散列表（hash-table）、
;; subr（内建函数，比如 cons, if, and 之类）、byte-code function，和其它特殊类型，例如缓冲区（buffer）。

;; 数字表达
;; 44 的不同进制表达方式
#b101100 ;; 二进制
#o54  ;; 八进制
#x2c  ;; 十六进制
#24r1k ;; 二十四进制

most-positive-fixnum  ;; 最大整型数
most-negative-fixnum  ;; 最小整型数

;; 数字测试函数
(integerp 1.)  ;; => t --是否为整数
(integerp 1.0) ;; => nil
(floatp 1.)  ;; => nil --是否为浮点数
(floatp -0.0e+NaN)  ;; => t
(numberp 1.0)  ;; => t --是否为数字
(zerop 0)  ;; => t  --是否为零
(wholenump 0) ;; => t --是否为非负整数

;; 注: 对于浮点数的相等测试都是不可靠的, 需要在一定误差内进行比较
(= 1. 1.0)  ;; => t --比较数字是否相等
(/= 1 1.0) ;; => nil --比较数字是否不相等
(eql 1. 1.0)  ;; => nil --比较两个对象是否全等于(包括类型)
(equal 1. 1.0)  ;; => nil --比较两个对象是否全等于


?A
?a
?\a
"\a"

'(1 . 2)
'(1 . "a")
'(1 . nil)
'(nil . nil)
'(1 . #1= (2 3 . #1#))
(cons 1 2)
(cons 'x '(a b))

(equal nil '())
(car nil)
(cdr nil)

(car '(1 2))
(cdr '(1 2))
(listp (cdr '(1 . 2)))
(listp (cdr '(1 2)))
(car '(1 . 2))
(cdr '(1 . 2))
(car '(1 2 3 . 4))
(cdr '(1 2 3 . 4))
(consp '(1 2))
(consp '(1 . 2))
(consp '(1 2 3 . 4))
(consp '(1 2 . (3 . 4)))

(list 1 2 3)
(list 1 '(2 3))
(cons 1 '(2 3))

(append '(1 2) 3)
(append '(1 2) '(3))

(nth 0 '(0 1 2 3))
(nthcdr 1 '(0 1 2 3))
(last '(0 1 2 3) 2)
(butlast '(0 1 2 3) 2)

(assoc "a" '(("a" . 97) ("b" . 98)))
(cdr (assoc "a" '(("a" . 97) ("b" . 98))))
(assoc-default "a" '(("a" . 97) ("b" . 98)))

(mapc '1+ '(1 2 3))
(mapcar '1+ '(1 2 3))

(progn
  (setq sum 0)
  (dolist (val '(1 2 3 4 5))
    (setq sum (+ sum val)))
  (identity sum))

(sequencep '(1 2 3))
(listp '(1 2 3))
(arrayp '(1 2 3))

[1 2 3]
(vector 1 2 3 '(4 5))

(intern-soft "abc")
'abc
(intern-soft "abc")
(intern-soft "abcd")
'#:abcd
(intern-soft "abcd")

(setq foo (make-vector 10 0))
(intern "abc" foo)
(intern-soft "abc" foo)
(unintern "abc" foo)
(intern-soft "abc" foo)

(set (intern "abc" foo) "I'm abc")
(symbol-value (intern "abc" foo))

(fset (intern "abc" foo) (symbol-function 'car))
(funcall (intern "abc" foo) '(a . b))

(put (intern "abc" foo) 'doc "this is abc")
(get (intern "abc" foo) 'doc)
(symbol-plist (intern "abc" foo))

(plist-get '(foo 4) 'foo)
(plist-get '(foo 4 bad) 'bar)
(setq my-plist '(bar t foo 4))
(setq my-plist (plist-put my-plist 'foo 69))
(setq my-plist (plist-put my-plist 'quux "abc"))


(defun foo (var1 var2 &optional opt1 opt2 &rest rest)
  (list var1 var2 opt1 opt2 rest))
(foo 1 2)
(foo 1 2 3)
(foo 1 2 3 4 5 6)

(funcall 'list 'x '(y) '(z))
(apply 'list 'x '(y) '(z))

(defmacro foo (arg)
  (list 'message "%d %d" arg arg))
(defun bar (arg)
  (message "%d %d" arg arg))
(let ((i 1))
  (bar (incf i)))
(let ((i 1))
  (foo (incf i)))

(macroexpand '(foo (incf i)))

'(a list of (+ 2 3) elements)
`(a list of (+ 2 3) elements)
`(a list of ,(+ 2 3) elements)
(setq some-list '(2 3))
`(1 ,some-list 4 ,@some-list)

(defun hello-world (name)
  (interactive "sWhat's your name? ")
  (message "Hello, %s!" name))
